package es.sjdigital.rv.datos.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import es.sjdigital.rv.datos.connection.DbConnection;
import es.sjdigital.rv.datos.vo.EtiquetasVO;
import es.sjdigital.rv.rv_error.Error;

public class EtiquetasDAO {

	/**
	 * Asigna una etiqueta a una canción. 
	 * Si el id de la etiqueta viene a 0 se crea una nueva
	 * Si no se le asigna el id
	 * En otro caso fallo
	 * @param cancion
	 * @param etiqueta
	 * @throws Error 
	 */
	public int setEtiqueta(int cancion, EtiquetasVO etiqueta) throws Error {
		//Comprobación de parametros
		if(cancion == 0 || etiqueta==null)
			throw new Error("Parametros incorrectos para cambiar una etiqueta");
		
		//Obtenemos el id de etiqueta correcto
		etiqueta.setId(getIdEtiqueta(etiqueta));
		
		//Establecemos la relación
		String query = new String();
		int resp = 0;
		DbConnection conex= new DbConnection();
		try {
			Statement db = conex.getConnection().createStatement();
			query = "INSERT INTO etiquetasxcancion ('id_cancion', 'id_etiqueta') VALUES"+
					" ('"+cancion+"','"+etiqueta.getId()+")";
			db.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
			ResultSet rs = db.getGeneratedKeys();
			if (rs != null && rs.next()) {
				resp = rs.getInt(1);
			}
			
		} catch (SQLException e) {
			throw new Error("Fallo a la hora de establecer la relación de etiqueta", e);
		}
		return resp;
	}
	
	/**
	 * Operación para conseguir las etiquetas de una canción
	 * @param cancion Id de la canción
	 * @return lista de etiquetas
	 * @throws Error 
	 */
	public List<EtiquetasVO> getEtiquetas(int cancion) throws Error{
		List<EtiquetasVO> resp = new ArrayList<EtiquetasVO>();
		DbConnection conex= new DbConnection();
		String query = new String();
		
		query="SELECT e.id, e.tag FROM etiquetas e"+
				"INNER JOIN etiquetasxcancion x ON e.id = x.id_etiqueta"+
				"WHERE x.id_cancion = "+cancion;		
		
		try {
			Statement db = conex.getConnection().createStatement();
			ResultSet st = db.executeQuery(query);
			
			//Guardamos los resultados
			while (st.next()){
				EtiquetasVO etiq_p = new EtiquetasVO();
				etiq_p.setId(st.getInt("id"));
				etiq_p.setTag(st.getString("tag"));
				resp.add(etiq_p);
			}
		} catch (SQLException e) {
			throw new Error("Fallo a la hora de obtener la relación de etiqueta", e);
		}
		return resp;
	}
	
	/**
	 * Elimina las etiquetas de una canción
	 * @param cancion id de la canción
	 * @throws Error
	 */
	public void deleteEtiquetas(int cancion) throws Error{
		DbConnection conex= new DbConnection();
		String query = new String();
		
		query = "DELETE FROM etiquetasxcancion WHERE id_cancion ="+cancion;
		try {
			Statement db = conex.getConnection().createStatement();
			db.executeQuery(query);
		} catch (SQLException e) {
			throw new Error("Fallo a la hora de obtener la relación de etiqueta", e);
		}
	}
	
	private int getIdEtiqueta(EtiquetasVO etiqueta) throws Error{
		int result =0;
		String query = new String();
		DbConnection conex= new DbConnection();

		try {
			Statement db = conex.getConnection().createStatement();
			
			//Comprobamos la etiqueta. Si no existe creamos una nueva
			query = "SELECT id FROM etiquetas WHERE tag = '"+etiqueta.getTag()+"'";
			ResultSet st = db.executeQuery(query);
			if(st != null && st.next())
				result= st.getInt("id");
			else {
				String query_nueva = "INSERT INTO etiquetas (tag) VALUES ('"+etiqueta.getTag()+"')";
				db.executeUpdate(query_nueva, Statement.RETURN_GENERATED_KEYS);
				ResultSet rs = db.getGeneratedKeys();
				if (rs != null && rs.next()) {
					result = rs.getInt("id");
				}
			}
				etiqueta.setId(0);		
			db.close();

		} catch (SQLException e) {
			throw new Error("Error a la hora de comprobar la etiqueta",e);
		}
		return result ;
	}
}
